package org.hzero.business.service;

import java.util.Map;

/**
 * @ClassName: OrderHelper
 * @Description: 通用的更新单据状态和撤回单据
 * @author: tianhao.luo@hand-china.com
 * @date: 2020/10/15  15:45
 */
public interface KnifeOrderHelper<Header, Line> {

    /**
     * 单状态变更，一般用于服务任务，更新单据为审批通过/审批拒绝
     *
     * @param headerId        单头
     * @param statusFieldName 状态字段名
     * @param statusCode      状态
     * @return 单头
     */
    Header updateOrderStatus(Long headerId, String statusFieldName, String statusCode);


    /**
     * 撤回单据，1.判断未被审批可撤回2.撤回前单据状态置为NEW3.撤销工作流
     *
     * @param tClass          实体类型
     * @param headerId        单头id(用来构造业务主键)
     * @param statusFieldName 状态字段
     * @return 对像
     */
    Header revokeOrder(Class<Header> tClass, Long headerId, String statusFieldName);


    /**
     * 通用提交工作流，1.校验是否是NEW和REJECTED状态单据2.更新单据为审批中状态3.提交工作流
     *
     * @param paramMap        流程变量参数
     * @param processKey      流程定义key
     * @param tClass          用来创建业务主键，提交单据的头id所在的类
     * @param headerId        单头id
     * @param statusFieldName 单据状态字段
     */
    void submitOrder(Class<Header> tClass, Map<String, Object> paramMap, String processKey, Long headerId, String statusFieldName);


    /**
     * 生成是否单据创建人登录的标记
     *
     * @param order              单据
     * @param createdByFieldName 创建人字段名
     * @return 是否登录的标记，登录返回1，否则为0
     */
    Long getLoginFlag(Header order, String createdByFieldName);


    /**
     * 删除头行
     *
     * @param headerId            单头id
     * @param statusCodeFieldName 单据头状态字段
     * @param linesHeaderIdColumn 行表关联单据头id字段
     * @param statusArray         允许删除的状态
     * @return 头数据
     */
    Header deleteHeaderAndLine(Long headerId, String statusCodeFieldName, String linesHeaderIdColumn, String... statusArray);
}
